home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / clang / mcomm600.zip / ZMIN.C < prev    next >
C/C++ Source or Header  |  1994-10-03  |  8KB  |  205 lines

  1.  
  2. ///////////////////////////////////////////////////////////////////
  3. //                                                               //
  4. //  ZMIN.C  --  program showing bare essentials for calling      //
  5. //              zmodem transfer code.                            //
  6. //  (c) Mike Dumdei, 6 Holly Lane, Texarkana TX 75503  USA       //
  7. //                                                               //
  8. //    bcc zmin.c zcmplr.c xyzgen.c zmlib_s.lib comm_s.lib        //
  9. //    cl zmin.c zcmplr.c xyzgen.c /link zmlib_s comm_s           //
  10. //                                                               //
  11. //    Expects the following data on command line:                //
  12. //     zmin com# { -B##### -L##### -H -E } -R                    //
  13. //     zmin com# { -B##### -L##### -H } -S files.lst             //
  14. //                                                               //
  15. //   Items in braces are optional.  B = baud rate, L = locked    //
  16. //   baud rate, H = use RTS/CTS handshake.  E = resume transfer  //
  17. //   (default in this program is to overwrite -- see below).     //
  18. //                                                               //
  19. ///////////////////////////////////////////////////////////////////
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22. #include <string.h>
  23. #include <ctype.h>
  24. #include "comm.h"
  25. #include "extra.h"
  26. #include "zmdos.h"
  27.  
  28. void main(int argc, char *argv[]);
  29. int ProcCmdLine(int argc, char *argv[]);
  30. void usage(void);
  31. void ZMsg(int type, ...);
  32.  
  33. //
  34. //  Following 2 longs REQUIRED for linker
  35. //
  36. long PrevHunds;
  37. long PrevSecs;
  38.  
  39. ASYNC port;                 /* declare an ASYNC port structure */
  40. int combase = 0x3f8;
  41. int irq = IRQ4;
  42. int vctr = VCTR4;           /* default port is COM1 */
  43. char params[12] = "";       /* port parameters */
  44. char lockedbaud[12] = "";   /* locked baud parameter */
  45. int msrflow = 0;            /* hardware flow control */
  46. char fnames[256] = "";      /* list of files to send if sending */
  47.  
  48. /*/////////////////////////////////////////////////////////
  49. //                                                       //
  50. //      Main                                             //
  51. //                                                       //
  52. //:mai////////////////////////////////////////////////// */
  53. void main(int argc, char *argv[])
  54. {
  55.     int i, rval, FIFOretry = 0, openmask = 0;
  56.  
  57.     if (ProcCmdLine(argc, argv) == 0)   // process command line
  58.         usage();
  59.     tickhookset(1);                     // enable MCOMM timer functions
  60.      //
  61.      //  open the port -- more code than necessary here but this code
  62.      //  overcomes serial port lockup problems on some PCI motherboards
  63.      //
  64.     AllocRingBuffer(&port, 2048, 4096, 0);
  65.     while (1)
  66.     {
  67.         i = async_open(&port, combase, irq, vctr|openmask, params);
  68.         if (i != 0)
  69.         {
  70.             if (i == 512 && (port.Stat3 & B_FIFO) && FIFOretry == 0
  71.              && !(openmask & 0x4000))
  72.             {
  73.                 openmask |= 0x4000;
  74.                 FIFOretry = 1;      /* FIFO retry code fixes some PCI */
  75.                 continue;           /* serial port lockup problems    */
  76.             }
  77.             tickhookset(0);
  78.             printf("\nSerial port open error, Error code = %d\n\a", i);
  79.             exit(i - 20); /* -20 so exit code don't clash with zm result */
  80.         }
  81.         if (FIFOretry == 1)
  82.         {
  83.             openmask &= ~0x4000;
  84.             FIFOretry = 2;          /* More FIFO retry code.  Opening */
  85.             tdelay(1);              /*  with FIFOs off, closing, and  */
  86.             async_close(&port);     /*  reopening with FIFOs on seems */
  87.             continue;               /*  to unlock the port.           */
  88.         }
  89.         if (ConnectBaud == 0L)
  90.         {
  91.             ConnectBaud = atol(port.BPDSstr);
  92.             strcpy(params, port.BPDSstr);
  93.         }
  94.         break;
  95.     }
  96.     async_msrflow(&port, msrflow);      // if -H on cmd line, enable RTS h/s
  97.  
  98.      //
  99.      //  Send/receive zmodem.  Requirements are: 1) async port opened,
  100.      //   2) timer tickhook enabled, 3) flow control enabled if using
  101.      //   hardware handshake, 4) ZMsg handler defined which can be an
  102.      //   empty function (see below)
  103.      //
  104.     if (TFlag.F.Receiving == 1)
  105.         rval = ZmodemRecv(&port);
  106.     else
  107.         rval = ZmodemSend(&port, fnames);
  108.  
  109.     async_close(&port);     // close the comm port (required)
  110.     tickhookset(0);         // disable MCOMM timer hook (required)
  111.     exit(rval);
  112. }
  113.  
  114. /*/////////////////////////////////////////////////////////
  115. //  ZMsg -- zmodem message handler                       //
  116. //:zms///////////////////////////////////////////////:z: */
  117. void ZMsg(int type, ...)
  118. {                           // ignore all progress messages
  119. }
  120.  
  121. /*/////////////////////////////////////////////////////////
  122. //  ProcCmdLine -- process commnad line args             //
  123. //:pro////////////////////////////////////////////////// */
  124. int ProcCmdLine(int argc, char *argv[])
  125. {
  126.                         /*   COM1   COM2   COM3   COM4  */
  127.     static int bases[4] = { 0x3f8, 0x2f8, 0x3e8, 0x2e8 };
  128.     static int irqs[4]  = {  IRQ4,  IRQ3,  IRQ4,  IRQ3 };
  129.     static int vctrs[4] = { VCTR4, VCTR3, VCTR4, VCTR3 };
  130.     int parg = 0, i, j;
  131.     char *p1;
  132.  
  133.     TFlag.F.ExistOpts = 3;      // overwrite file if it already exist
  134.     for (i = 1; i < argc; i++)
  135.     {
  136.         p1 = strupr(argv[i]);
  137.         if (*p1 == '-' || *p1 == '/')
  138.             ++p1;
  139.         if (parg == 0)
  140.         {
  141.             if (strncmp(argv[i], "COM", 3) == 0)
  142.             {
  143.                 j = atoi(isdigit(*(p1 += 3)) ? p1 : argv[++i]);
  144.                 if (j < 1 && j > 4)
  145.                     usage();
  146.                 --j, parg = 1;
  147.                 combase = bases[j], irq = irqs[j], vctr = vctrs[j];
  148.                 continue;
  149.             }
  150.         }
  151.         switch (*p1)
  152.         {
  153.           case 'B':             /* connect baud rate */
  154.             strcpy(params, (isdigit(*++p1)) ? p1 : argv[++i]);
  155.             break;
  156.           case 'L':             /* locked baud rate */
  157.             strcpy(lockedbaud, (isdigit(*++p1)) ? p1 : argv[++i]);
  158.             break;
  159.           case 'H':             /* enable hardware handshake */
  160.             msrflow = B_CTS | B_RTS;
  161.             break;
  162.           case 'E':             /* zmodem resume if file exists */
  163.             TFlag.F.ExistOpts = 1;
  164.             break;
  165.           case 'R':             /* receiving */
  166.             TFlag.F.Receiving = 1;
  167.             return 1;
  168.           case 'S':             /* sending -- file name(s) follow */
  169.             TFlag.F.Receiving = 0;
  170.             if (*++p1 > ' ')
  171.                 argv[i--] = p1;
  172.             while (++i < argc)
  173.             {
  174.                 strcat(fnames, " ");
  175.                 strcat(fnames, argv[i]);
  176.             }
  177.             return 1;
  178.           default:
  179.             return 0;
  180.         }
  181.     }
  182.     return 0;
  183. }
  184.  
  185. /*///////////////////////////////////////////////
  186. //  Usage                                      //
  187. //:usa//////////////////////////////////////// */
  188. void usage(void)
  189. {
  190.     static char msg[] = "\n\
  191. \
  192. ZMIN -- Zmodem Protocol Driver 1.00\n\
  193.  (c) 1994, Mike Dumdei, 6 Holly Lane, Texarkana Tx 75503\n\
  194. \n\
  195. ** CODE DEMO ONLY!  DO NOT DISTRIBUTE AS AN .EXE!\n\
  196. \n\
  197. zmin com# { -B##### -L##### -H -E# } -R\n\
  198. zmin com# { -B##### -L##### -H } -S file1 file2 ...\n\n";
  199.  
  200.     printf(msg);
  201.     exit(100);
  202. }
  203.  
  204.  
  205.